package hot100.哈希.考点大于hash的垃圾题;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/** 128-最长连续数列
/**
 * 给定一个未排序的整数数组 nums ，找出数字连续的最长序列（不要求序列元素在原数组中连续）的长度。
 *
 * 所求的是一个链条 基于此 判断元素是不是某条链上的一环即可 chain-1 chain chain+1
 */
public class findChain128 {

    /**
     * 不推荐 在入集合的途中进行链条逻辑的处理 这会让链条不完整
     */
    public int error(int[] nums) {

        int nowLength = 1;
        int maxLength = 1;
        Map<Integer, Integer> headToBottom = new HashMap<>(nums.length);

        for (int i = 0; i < nums.length; i++) {
            if (headToBottom.get(nums[i] - 1) == null) {
                nowLength = 1;
            } else {
                if (nowLength > maxLength){
                    maxLength = nowLength;
                }
                headToBottom.put(nums[i], 1);
            }
        }

        return maxLength;
    }

    public int solution(int[] nums) {
        int target = 0;

        Set set = new HashSet(nums.length);
        for (int i = 0; i < nums.length; i++) {
            set.add(nums[i]);
        }

        for (int i = 0; i < nums.length; i++) { //有资格作为一条新链条吗？
            if (!set.contains(nums[i] -1)) {

                int nowNum = nums[i]; //新链条遍历元素当前值与链长
                int thisChainLength = 1;
                while (set.contains(nowNum + 1)) { //处理新链条
                    nowNum ++;
                    thisChainLength++;
                    if (thisChainLength > target) {
                        target = thisChainLength;
                    }
                }
            }
        }
        return target;
    }



    public static void main(String[] args) {
        int[] nums = new int[]{100,4,200,1,3,2};

        findChain128 a = new findChain128();
        System.out.println(a.solution(nums));

    }
}